﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Microsoft.VisualBasic.PowerPacks;

using MakeIT.MiraPark.Negocios;
using System.Text.RegularExpressions;

namespace MiraPark
{
    public partial class FormCadastroES : Form
    {
        int timerticks = 0;

        CabineVO cabineVO = CabineVO.CreateCabineVO();
        UsuarioVO usuarioVO = null;
       
        public FormCadastroES()
        {
            InitializeComponent();
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            DateTime agora = DateTime.Now;
            this.textBoxTime.Text = agora.ToLongTimeString();
            this.monthCalendar1.TodayDate = agora;


            if (timerticks == 0)
            {
                List<MovimentacaoVO> listMovimentacaoVO = ModelBO.getMovimentacoes(null, null, true, false, null, false);
                if (listMovimentacaoVO != null)
                    this.labelVagasUtilizadas.Text = listMovimentacaoVO.Count.ToString();
                else
                    this.labelVagasUtilizadas.Text = "0";
            }

            timerticks += this.timer1.Interval;

            if (timerticks > 60000)
            {
                if (agora.Date <= DateTime.Parse(ModelBO.getParametro(ParametroVO.parametros.FechamentoDiario)).Date)
                {
                    MessageBox.Show("Fechamento executado para a data atual!\nOperação bloqueada!");
                }
                else
                {
                    this.buttonTicket.Enabled = true;
                }

                timerticks = 0;
            }

        }
        public void setUser(UsuarioVO usuarioVO)
        {
            this.usuarioVO = usuarioVO;
        }
        private void FormCadastroES_Load(object sender, EventArgs e)
        {
            cabineVO = ModelBO.getCabine(int.Parse(ModelBO.getParametro(ParametroVO.parametros.IdCabine)));
            this.Text = ".:: Cabine " + cabineVO.cabine + " ::. Entrada e Saídas";

            if (this.usuarioVO == null)
            {
                this.usuarioVO = (UsuarioVO) this.Tag;
            }

            this.labelCor.Text = "";
            this.labelMarca.Text = "";
            this.labelMensalista.Text = "";
            this.labelModelo.Text = "";
            this.labelTipoCobranca.Text = "";
            this.labelTipo.Text = "";
            this.shapeContainer1.Shapes.Clear();
               
            List<TipoVeiculoVO> tipoVeiculos = ModelBO.getTipoVeiculos(true, null);
            for (int i = 0; i < 2; i++)
            {
                if (i + 1 <= tipoVeiculos.Count)
                {
                    Control myButton = this.groupBoxTipos.Controls["buttonTipoVeiculo" + (i + 1)];
                    TipoVeiculoVO myTipoVeiculo = tipoVeiculos[i];
                    myButton.Text = myTipoVeiculo.tipoVeiculo.ToUpper().Trim();
                    myButton.Tag = myTipoVeiculo;
                    myButton.Enabled = true;
                }
            }
            if (tipoVeiculos.Count > 0)
                _buttonTipoVeiculo1_Click(tipoVeiculos[0]);
            this.buttonMaisTipoVeiculos.Enabled=(tipoVeiculos.Count > 2);

            List<CorVO> cores = ModelBO.getCores();
            for (int i=0; i<8;i++){
                if (i+1 <= cores.Count)
                {
                    Control myButton = this.groupBoxCores.Controls["buttonCor" + (i + 1)];
                    CorVO myCor = cores[i];
                    myButton.Text = myCor.nome.ToUpper().Trim();
                    myButton.BackColor = System.Drawing.Color.FromArgb(myCor.a, myCor.r, myCor.g, myCor.b);
                    if (myCor.r+ myCor.g+ myCor.b<257) 
                        myButton.ForeColor = System.Drawing.Color.FromArgb(255, 255, 255, 255);
                    myButton.Tag = myCor;
                    myButton.Enabled = true;
                }

            }
            this.buttonMaisCores.Enabled = (cores.Count > 8);

            string keyboard = ModelBO.getParametro(ModelBO.getParametro(ParametroVO.parametros.KeyboardES));
                //"1234567890QWERTYUIOPASDFGHJKLÇZXCVBNM";

            foreach (char key in keyboard.ToCharArray())
            {
                Button myButton = new Button();
                myButton.Name = "buttonKey"+key;
                myButton.Size = new System.Drawing.Size(52, 47);
                myButton.TabIndex = 4;
                myButton.Text = key.ToString();
                myButton.UseVisualStyleBackColor = true;
                myButton.Click += new System.EventHandler(this.buttonKey1_Click);
                flowLayoutPanelKeyboard.Controls.Add(myButton);

            }
            Button myButton2 = new Button();
            myButton2.Name = "buttonEnter";
            myButton2.Size = new System.Drawing.Size(167, 47);
            myButton2.TabIndex = 4;
            myButton2.Text = "BUSCAR";
            myButton2.UseVisualStyleBackColor = true;
            myButton2.Click += new System.EventHandler(this.buttonKey1_Click);
            flowLayoutPanelKeyboard.Controls.Add(myButton2);

            this.textBoxPlaca.SelectionStart = currentPos;
            this.textBoxPlaca.SelectionLength = 1;

        }

        private void buttonTipoVeiculo1_Click(object sender, EventArgs e)
        {
            _buttonTipoVeiculo1_Click((TipoVeiculoVO)((Button)sender).Tag);
        }
        private void _buttonTipoVeiculo1_Click(TipoVeiculoVO tipoVeiculoVO)
        {
            labelTipo.Text = tipoVeiculoVO.tipoVeiculo;
            labelTipo.Tag = tipoVeiculoVO;
            labelMarca.Text = "";
            labelMarca.Tag = null;

            List<MarcaVO> marcas = ModelBO.getMarcasByTipoVeiculo(((TipoVeiculoVO)labelTipo.Tag).idTipoVeiculo);
            for (int i = 0; i < 6; i++)
            {
                Control myButton = this.groupBoxMarcas.Controls["buttonMarca" + (i + 1)];
                if (i + 1 <= marcas.Count)
                {
                    MarcaVO myMarca = marcas[i];
                    myButton.Text = myMarca.marca.ToUpper().Trim();
                    myButton.Tag = myMarca;
                    myButton.Enabled = true;
                }
                else
                {
                    myButton.Text = "";
                    myButton.Tag = null;
                    myButton.Enabled = false;
                }
            }
            this.buttonMaisMarcas.Enabled = (marcas.Count > 6);

            labelModelo.Text = "";
            labelModelo.Tag = null;
            for (int i = 0; i < 6; i++)
            {
                Control myButton = this.groupBoxModelos.Controls["buttonModelo" + (i + 1)];
                myButton.Text = "";
                myButton.Tag = null;
                myButton.Enabled = false;
            }
            buttonMaisModelos.Enabled = true;
        }
        private void buttonCor1_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            if (labelCor.Text.Equals(btn.Text))
            {
                labelCor.Text = "";
                labelCor.Tag = null;
            }
            else
            {
                labelCor.Text = btn.Text;
                labelCor.Tag = btn.Tag;
            }
        }
        private void buttonMarca1_Click(object sender, EventArgs e)
        {
            groupBoxModelos.Text = "Modelos (" + ((Button)sender).Text+")";
            Button btn = (Button)sender;

            // se for a mesma marca, limpar a seleção (on/off)
            if (labelMarca.Text.Equals(btn.Text))
            {
                labelMarca.Text = "";
                labelMarca.Tag = null;
                labelModelo.Text = "";
                labelModelo.Tag = null;
                return;
            }
            else
            {
                labelMarca.Text = btn.Text;
                labelMarca.Tag = btn.Tag;
            }

            List<ModeloVO> modelos = ModelBO.getModelos(false, true, (MarcaVO)labelMarca.Tag, null, (TipoVeiculoVO)labelTipo.Tag,false);
            for (int i = 0; i < 6; i++)
            {
                Control myButton = this.groupBoxModelos.Controls["buttonModelo" + (i + 1)];

                if (i + 1 <= modelos.Count)
                {
                    ModeloVO myModelo = modelos[i];
                    myButton.Text = myModelo.modelo.ToUpper().Trim();
                    myButton.Tag = myModelo;
                    myButton.Enabled = true;
                }
                else
                {
                    myButton.Text = "";
                    myButton.Tag = null;
                    myButton.Enabled = false;
                }
            }
            if (labelModelo.Tag != null)
            {
                if (((MarcaVO)labelMarca.Tag).idMarca != ((ModeloVO)labelModelo.Tag).idMarca)
                {
                    labelModelo.Text = "";
                    labelModelo.Tag = null;
                }
            }
            this.buttonMaisModelos.Enabled = true; //(modelos.Count > 6);

        }
        private void buttonModelo1_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            if (labelModelo.Text.Equals(btn.Text))
            {
                labelModelo.Text = "";
                labelModelo.Tag = null;
            }
            else
            {
                labelModelo.Text = btn.Text;
                labelModelo.Tag = btn.Tag;
                MarcaVO marcaVO = ModelBO.getMarca(((ModeloVO)labelModelo.Tag).idMarca);
                labelMarca.Text = marcaVO.marca.ToUpper().Trim();
                labelMarca.Tag = marcaVO;
            }
        }
        private void buttonColisao_Click(object sender, EventArgs e)
        {
            TipoColisaoVO tipoColisaoVO = (TipoColisaoVO)((Button)sender).Tag;
            ovalShapeAdd(tipoColisaoVO);
        }
        private void ovalShapeColisao_Click(object sender, EventArgs e)
        {
            TipoColisaoVO tipoColisaoVO = (TipoColisaoVO)((OvalShape)sender).Tag;
            ovalShapeAdd(tipoColisaoVO);
        }
        private void ovalShapeAdd(TipoColisaoVO tipoColisaoVO)
        {
            OvalShape ovalShape = new OvalShape();
            ovalShape.Cursor = Cursors.Hand;
            ovalShape.Tag = tipoColisaoVO;
            ovalShape.BackColor = System.Drawing.Color.Red;
            ovalShape.FillColor = System.Drawing.Color.Red;
            ovalShape.FillGradientColor = System.Drawing.Color.Red;
            ovalShape.FillStyle = FillStyle.Percent50;
            ovalShape.Location = new System.Drawing.Point(tipoColisaoVO.avariaX, tipoColisaoVO.avariaY);
            ovalShape.Name = "ovalShape1";
            ovalShape.SelectionColor = System.Drawing.SystemColors.Control;
            ovalShape.Size = new System.Drawing.Size(tipoColisaoVO.avariaWidth, tipoColisaoVO.avariaHeight);
            ovalShape.Click += new System.EventHandler(this.ovalShapeRemove_Click);

            shapeContainer1.Shapes.AddRange(new Shape[] { ovalShape });
        }
        private void ovalShapeRemove_Click(object sender, EventArgs e)
        {
            shapeContainer1.Shapes.Remove((Shape)sender);
        }

        private void buttonMaisTipoVeiculos_Click(object sender, EventArgs e)
        {
            FormMaisSelect formx = new FormMaisSelect();
            formx.MaisTipoVeiculos(new System.EventHandler(this.buttonTipoVeiculo1_Click));
            formx.ShowDialog(this);
        }
        private void buttonMaisCores_Click(object sender, EventArgs e)
        {
            FormMaisSelect formx = new FormMaisSelect();
            formx.MaisCores(new System.EventHandler(this.buttonCor1_Click));
            formx.ShowDialog(this);
        }
        private void buttonMaisMarcas_Click(object sender, EventArgs e)
        {
            FormMaisSelect formx = new FormMaisSelect();
            formx.MaisMarcas(new System.EventHandler(this.buttonMarca1_Click), (TipoVeiculoVO)labelTipo.Tag);
            formx.ShowDialog(this);
        }
        private void buttonMaisModelos_Click(object sender, EventArgs e)
        {
            FormMaisSelect formx = new FormMaisSelect();
            formx.MaisModelos(new System.EventHandler(this.buttonModelo1_Click), (TipoVeiculoVO)labelTipo.Tag);
            formx.ShowDialog(this);
        }
        private void buttonBuscaAvaria_Click(object sender, EventArgs e)
        {
            FormColisaoSelect formx = new FormColisaoSelect();
            formx.MaisTipoColisoes(new System.EventHandler(this.ovalShapeColisao_Click));
            formx.ShowDialog(this);
        }

        private int currentPos = 0;
        private void buttonKey1_Click(object sender, EventArgs e)
        {

            if (((Button)sender).Name.Equals("buttonLeft"))
            {
                if (currentPos > 0)
                {
                    currentPos--;
                }
            }
            else if (((Button)sender).Name.Equals("buttonRight"))
            {
                if (currentPos + 1 < this.textBoxPlaca.MaxLength)
                {
                    currentPos++;
                }
            }
            else if (((Button)sender).Name.Equals("buttonBackSpace"))
            {
                if (currentPos > 0)
                {
                    char[] texto = this.textBoxPlaca.Text.ToCharArray();
                    texto[currentPos - 1] = '_';
                    textBoxPlaca.Text = new string(texto);
                    currentPos--;
                }
            }
            else if (((Button)sender).Name.Equals("buttonDel"))
            {
                char[] texto = this.textBoxPlaca.Text.ToCharArray();
                texto[currentPos] = '_';
                textBoxPlaca.Text = new string(texto);
                if (currentPos + 1 < this.textBoxPlaca.MaxLength)
                {
                    currentPos++;
                }
            }
            else if (((Button)sender).Name.Equals("buttonDeleteAll"))
            {
                textBoxPlaca.Text = "__________";
                currentPos = 0;
            }
            else if (((Button)sender).Name.Equals("buttonEnter"))
            {
                string ticket = textBoxPlaca.Text.Replace('_', ' ').Trim();
                if (ticket.Length > 0)
                {
                    try 
                    {
                        MovimentacaoVO movimentacaoVO = ModelBO.getMovimentacao(int.Parse(ticket));
                        if (movimentacaoVO != null)
                        {
                            this.textBoxPlaca.Text = movimentacaoVO.placa.PadRight(10, '_');
                            currentPos = movimentacaoVO.placa.Length;
                        }
                    }
                    catch (Exception ex) { }
                }
            }
            else if (currentPos < this.textBoxPlaca.MaxLength)
            {
                char[] texto = this.textBoxPlaca.Text.ToCharArray();
                texto[currentPos] = ((Button)sender).Text[0];
                textBoxPlaca.Text = new string(texto);
                if (currentPos + 1 < this.textBoxPlaca.MaxLength)
                    currentPos++;
            }
            this.textBoxPlaca.SelectionStart = currentPos;
            this.textBoxPlaca.SelectionLength = 1;

            verificaPlaca();

        }
        private void buttonEscrever_Click(object sender, EventArgs e)
        {
            FormKeyboard formx = new FormKeyboard();
            formx.setText(this.textBoxObs.Text);
            formx.ShowDialog(this);
            this.textBoxObs.Text = formx.getText();
            //MessageBox.Show( ((FormKeyboard)formx).getText("teste"));

        }
        private void buttonReset_Click(object sender, EventArgs e)
        {
            //this.labelTipo.Tag = null;
            this.labelCor.Tag = null;
            this.labelMarca.Tag = null;
            this.labelModelo.Tag = null;
            this.labelMensalista.Tag = null;
            this.labelTipoCobranca.Tag = null;

            this.textBoxObs.Text = "";
            this.textBoxPlaca.Text = "__________";
            currentPos = 0;
            this.textBoxPlaca.SelectionStart = currentPos;
            this.textBoxPlaca.SelectionLength = 1;

            //this.labelTipo.Text = "";
            this.labelCor.Text = "";
            this.labelMarca.Text = "";
            this.labelModelo.Text = "";
            this.labelMensalista.Text = "";
            this.labelTipoCobranca.Text = "";

            this.shapeContainer1.Shapes.Clear();
        }

        private void verificaPlaca()
        {
            string placa = this.textBoxPlaca.Text;
            placa = placa.Replace('_', ' ').Trim();

            if (placa.Length > 0)
            {
                int? idCliente = null;
                StringBuilder mensagem = new StringBuilder();

                //Verificar pendencias
                List<PendenciaVO> listPendenciaVOs = ModelBO.getPendencias(null, null, placa, true, false, null, null);
                if (listPendenciaVOs != null && listPendenciaVOs.Count > 0)
                {
                    mensagem.AppendLine("Veículo com pendências!");
                    mensagem.AppendLine("----------------------------------------");
                    foreach (PendenciaVO pendenciaVO in listPendenciaVOs)
                    {
                        mensagem.AppendLine("\t" + pendenciaVO.valor+" - " + pendenciaVO.pendencia);
                    }
                    mensagem.AppendLine("");

                }

                //Verificar se é diaria especial
                List<MovimentacaoVO> listMovimentacaoVOs = ModelBO.getMovimentacoes(DateTime.Now, placa, false, true, MovimentacaoVO.Especie.DiariaEspecial, false);
                if (listMovimentacaoVOs != null && listMovimentacaoVOs.Count > 0 && (listMovimentacaoVOs.Count%2)==1)
                {
                    mensagem.AppendLine("Veiculo com Diária Especial");
                    mensagem.AppendLine("");
                    this.labelMensalista.Text = "";
                    this.labelMensalista.Tag = null;
                    this.labelTipoCobranca.Text = MovimentacaoVO.Especie.DiariaEspecial;
                    this.labelTipoCobranca.Tag = MovimentacaoVO.Especie.DiariaEspecial;
                    this.textBoxObs.Text = listMovimentacaoVOs[0].obs;
                }
                else
                {
                    // verificar se é veiculo de mensalista
                    MensalistaVO mensalistaVO = ModelBO.getMensalistaByPlaca(placa);
                    if (mensalistaVO != null)
                    {
                        this.labelMensalista.Text = mensalistaVO.clienteVO.nome;
                        this.labelMensalista.Tag = mensalistaVO;
                        this.labelTipoCobranca.Text = MovimentacaoVO.Especie.Mensal;
                        this.labelTipoCobranca.Tag = MovimentacaoVO.Especie.Mensal;

                        idCliente = mensalistaVO.idCliente; // sera usado abaixo na procura por alertas

                        ModelBO.getMensalistaXVeiculos(mensalistaVO);
                        if (mensalistaVO.mensalistaxVeiculoVOs.Count > 0)
                        {
                            int qtdVeiculos = 1;
                            string tempVeiculos = "";
                            foreach (MensalistaxVeiculoVO mensalistaxVeiculoVO in mensalistaVO.mensalistaxVeiculoVOs)
                            {
                                if (mensalistaxVeiculoVO.placa.Equals(placa))
                                {
                                    // exibir as observações do veiculo
                                    if (mensalistaxVeiculoVO.obs.Trim().Length > 0)
                                    {
                                        mensagem.AppendLine("Observação para o veículo do mensalista");
                                        mensagem.AppendLine("----------------------------------------");
                                        mensagem.AppendLine(mensalistaxVeiculoVO.obs.Trim());
                                        mensagem.AppendLine("");
                                    }
                                }
                                else
                                {
                                    // verificar se já existe entrada de outro veículo deste mensalista
                                    MovimentacaoVO movimentacaoVO = ModelBO.getMovimentacao(mensalistaxVeiculoVO.placa, true, false, false);
                                    if (movimentacaoVO != null && movimentacaoVO.especie.Equals(MovimentacaoVO.Especie.Mensal))
                                    {
                                        qtdVeiculos++;
                                        tempVeiculos += "\t" + mensalistaxVeiculoVO.placa + "\r\n";

                                    }
                                }
                            }
                            MovimentacaoVO movimentacaoVO2 = ModelBO.getMovimentacao(placa, true, false, false);
                            if (movimentacaoVO2 == null)
                            {
                                if (qtdVeiculos > mensalistaVO.qtdVagas)
                                {
                                    mensagem.AppendLine("Entrada de veículos do mensalista maior que a quantidade contratada.(" + mensalistaVO.qtdVagas + ")");
                                    mensagem.AppendLine("Esta entrada será cobrada como avulso!");
                                    mensagem.AppendLine("\tVeiculos já estacionados:");
                                    mensagem.Append(tempVeiculos);
                                    mensagem.AppendLine("");
                                    this.labelTipoCobranca.Text = MovimentacaoVO.Especie.Mensal + " (Como Avulso)";
                                    this.labelTipoCobranca.Tag = MovimentacaoVO.Especie.Avulso;
                                }
                            }
                            else
                            {
                                this.labelTipoCobranca.Text = movimentacaoVO2.especie;
                                this.labelTipoCobranca.Tag = movimentacaoVO2.especie;
                            }


                        }

                        List<MensalistaXFranquiaVO> listMensalistaXFranquiaVOs = ModelBO.getMensalistaXFranquia(mensalistaVO.idMensalista,DateTime.Today,null);
                        if (listMensalistaXFranquiaVOs == null || listMensalistaXFranquiaVOs.Count == 0)
                        {
                            mensagem.AppendLine("ATENÇÂO: Mensalista sem período contratado!");
                            mensagem.AppendLine("\tRenove o período para este mensalista ou será cobrado como avulso.");
                            mensagem.AppendLine("");
                            this.labelTipoCobranca.Text = MovimentacaoVO.Especie.Mensal + " (Como Avulso)";
                            this.labelTipoCobranca.Tag = MovimentacaoVO.Especie.Avulso;
                        }
                        else if (listMensalistaXFranquiaVOs.Find(f => f.dataFim >= DateTime.Today) == null)
                        {
                            mensagem.AppendLine("ATENÇÂO: O(s) período(s) contratado(s) deste mensalista não cobrem toda a estadia!");
                            mensagem.AppendLine("");
                        }
                        foreach (MensalistaXFranquiaVO mensalistaXFranquiaVO in listMensalistaXFranquiaVOs)
                        {
                            TimeSpan dataDiff = mensalistaXFranquiaVO.dataFim - DateTime.Today;
                            if (dataDiff.Days <= 5)
                            {
                                mensagem.AppendLine("O período contratado deste mensalista expira em " + dataDiff.Days + "dia(s)");
                                mensagem.AppendLine("\tperíodo contratado: " + mensalistaXFranquiaVO.dataIni.ToShortDateString() + " a " + mensalistaXFranquiaVO.dataFim.ToShortDateString());
                                mensagem.AppendLine("");
                            }
                        }

                    }
                    else
                    {
                        this.labelMensalista.Text = "";
                        this.labelMensalista.Tag = null;
                        this.labelTipoCobranca.Text = MovimentacaoVO.Especie.Avulso;
                        this.labelTipoCobranca.Tag = MovimentacaoVO.Especie.Avulso;
                    }
                }

                // Alertas
                List<AlertaVO> listaAlertaVO = ModelBO.getAlertas(placa, idCliente, AlertaVO.Situacao.Pendente);
                if (listaAlertaVO != null && listaAlertaVO.Count > 0)
                {
                    mensagem.AppendLine("Alertas");
                    mensagem.AppendLine("-------");
                    
                    foreach (AlertaVO alertaVO in listaAlertaVO)
                    {
                        mensagem.AppendLine((alertaVO.apenasComunicar ? "Comunicar" :
                                        (alertaVO.impedirEntrada ? "Impedir entrada" :
                                        (alertaVO.reterSaida ? "Reter saída" : ""))) +
                                         "->" + alertaVO.mensagem);
                        if (!alertaVO.impedirEntrada)
                        {
                            alertaVO.situacao = AlertaVO.Situacao.Executado;
                            ModelBO.setAlerta(alertaVO);
                        }
                    }
                    mensagem.AppendLine("");
                }
 

                labelCor.Text = "";
                labelCor.Tag = null;
                labelMarca.Text = "";
                labelMarca.Tag = null;
                labelModelo.Text = "";
                labelModelo.Tag = null;
                this.shapeContainer1.Shapes.Clear();

                VeiculoVO veiculoVO = null;
                veiculoVO = ModelBO.getVeiculo(placa);

                if (veiculoVO != null)
                {
                    if (veiculoVO.idCor != -1)
                    {
                        CorVO corVO = ModelBO.getCor(veiculoVO.idCor);
                        labelCor.Text = corVO.nome;
                        labelCor.Tag = corVO;
                    }
                    if (veiculoVO.idMarca != -1)
                    {
                        MarcaVO marcaVO = ModelBO.getMarca(veiculoVO.idMarca);
                        labelMarca.Text = marcaVO.marca;
                        labelMarca.Tag = marcaVO;
                    }
                    if (veiculoVO.idModelo != -1)
                    {
                        ModeloVO modeloVO = ModelBO.getModelo(veiculoVO.idModelo);
                        labelModelo.Text = modeloVO.modelo;
                        labelModelo.Tag = modeloVO;
                        if (modeloVO.obs.Trim().Length > 0)
                        {
                            mensagem.AppendLine("Observações para este modelo ("+modeloVO.modelo+")");
                            mensagem.AppendLine("----------------------------");
                            mensagem.AppendLine(modeloVO.obs.Trim());
                            mensagem.AppendLine("");
                        }
                    }
                    this.textBoxObs.Text = veiculoVO.obs;

                    TipoVeiculoVO tipoVO = ModelBO.getTipoVeiculo(veiculoVO.idTipo);
                    if (labelTipo.Tag == null || ((TipoVeiculoVO)labelTipo.Tag).idTipoVeiculo != tipoVO.idTipoVeiculo)
                        _buttonTipoVeiculo1_Click(tipoVO);

                    ModelBO.getVeiculoXAvarias(veiculoVO);
                    foreach (VeiculoXAvariaVO veiculoXAvariaVO in veiculoVO.veiculoXAvariaVOs)
                    {
                        TipoColisaoVO tipoColisaoVO = ModelBO.getTipoColisao(veiculoXAvariaVO.idColisao);
                        ovalShapeAdd(tipoColisaoVO);
                    }

                }
                    
                if (mensagem.Length > 0)
                {
                    FormMessage formx = new FormMessage();
                    formx.setText(mensagem.ToString());
                    formx.ShowDialog(this);
                }
            }
        }
        private void buttonTicket_Click(object sender, EventArgs e)
        {
            string placa = this.textBoxPlaca.Text;
            placa = placa.Replace('_',' ').Trim();

            if (this.monthCalendar1.TodayDate.Date <= DateTime.Parse(ModelBO.getParametro(ParametroVO.parametros.FechamentoDiario)).Date)
            {
                MessageBox.Show("Fechamento executado para a data atual!\nOperação bloqueada!");
                return;
            }
            
            if (placa.Length == 0)
            {
                MessageBox.Show("Informe a placa", "Aviso");
                return;
            }
            if (placa.Length != 7)
            {
                MessageBox.Show("Informe a placa com 3 letras e 4 numeros", "Aviso");
                return;
            }

            if (this.labelTipo.Tag == null)
            {
                MessageBox.Show("Informe o tipo de veículo", "Aviso!");
                return;
            }
                
            // incluir veiculo na tabela de veiculos
            bool novo = false;
            VeiculoVO veiculoVO = ModelBO.getVeiculo(placa);
            if (veiculoVO == null)
            {
                veiculoVO = VeiculoVO.CreateVeiculoVO();
                veiculoVO.placa = placa;
                novo = true;
            }

            veiculoVO.idTipo = (this.labelTipo.Tag == null ? -1 : ((TipoVeiculoVO)this.labelTipo.Tag).idTipoVeiculo);
            veiculoVO.idCor = (this.labelCor.Tag == null ? -1 : ((CorVO)this.labelCor.Tag).idCor);
            veiculoVO.idMarca = (this.labelMarca.Tag == null ? -1 : ((MarcaVO)this.labelMarca.Tag).idMarca);
            veiculoVO.idModelo = (this.labelModelo.Tag == null ? -1 : ((ModeloVO)this.labelModelo.Tag).idModelo);
            veiculoVO.idPorte = (this.labelModelo.Tag == null ? -1 : ((ModeloVO)this.labelModelo.Tag).idPorteVeiculo);
            veiculoVO.obs = this.textBoxObs.Text;

            if (novo)
                ModelBO.newVeiculo(veiculoVO);
            else{
                ModelBO.setVeiculo(veiculoVO);
                ModelBO.getVeiculoXAvarias(veiculoVO);
                ModelBO.delVeiculoXAvarias(veiculoVO.veiculoXAvariaVOs);
                veiculoVO.veiculoXAvariaVOs = new List<VeiculoXAvariaVO>();
            }
            if (this.shapeContainer1.Shapes.Count > 1)
                foreach (Shape shape in this.shapeContainer1.Shapes)
                    if (shape.Tag != null)
                    {
                        TipoColisaoVO tipoColisaoVO = (TipoColisaoVO)shape.Tag;
                        if (veiculoVO.veiculoXAvariaVOs.Find(va => va.idColisao == tipoColisaoVO.idTipoColisao) == null)
                            veiculoVO.veiculoXAvariaVOs.Add(VeiculoXAvariaVO.CreateVeiculoXAvariaVO(veiculoVO.placa, tipoColisaoVO.idTipoColisao));
                    }
            ModelBO.newVeiculoXAvarias(veiculoVO.veiculoXAvariaVOs);


            // entrada ou saida?
            MovimentacaoVO movimentacaoVO = ModelBO.getMovimentacao(placa, true, false, false);
            if (movimentacaoVO != null)
            {
                //Apontar saida
                movimentacaoVO.idCabineS = cabineVO.idCabine;
                movimentacaoVO.saida = DateTime.Now;

                //Saida especial
                if (movimentacaoVO.especie.Equals(MovimentacaoVO.Especie.DiariaEspecial))
                {
                    MovimentoVO movimentoVO = MovimentoVO.CreateMovimentoVO();
                    movimentoVO.especie = MovimentacaoVO.Especie.DiariaEspecial;
                    movimentoVO.idMovimentacao = movimentacaoVO.idMovimentacao;
                    movimentoVO.idTabelaAvulso = -1;
                    movimentoVO.idTabelaConvenio = -1;
                    movimentoVO.idTabelaConvenioP = -1;
                    movimentoVO.idTabelaMensal = -1;
                    movimentoVO.periodo = "Saída diária especial";
                    ModelBO.setMovimento(movimentoVO);

                    StringBuilder mensagem = new StringBuilder();
                    mensagem.Append(Ticket.getHeader());
                    mensagem.AppendLine("<ce>RECIBO "+movimentacaoVO.saida.ToString("dddd dd/MM/yyyy HH:mm:ss")+"</ce>");
                    mensagem.AppendLine("------------------------------------------------");
                    mensagem.AppendLine("");
                    mensagem.AppendLine("Seq.: " + movimentacaoVO.ticket.ToString().PadLeft(4, '0'));
                    mensagem.AppendLine((this.labelMarca.Tag != null ? this.labelMarca.Text + " " : "") + (this.labelModelo.Tag != null ? this.labelModelo.Text + " " : "") + (this.labelCor.Tag != null ? this.labelCor.Text : ""));
                    mensagem.AppendLine("<b>Placa : " + movimentacaoVO.placa+"</b>");
                    mensagem.AppendLine("Entrada : "+movimentacaoVO.entrada.ToShortDateString()+ " Hora : "+movimentacaoVO.entrada.ToShortTimeString());
                    TimeSpan estadia = movimentacaoVO.saida-movimentacaoVO.entrada;
                    mensagem.AppendLine("Tempo estacionado : " + estadia.Hours.ToString() + "h" + estadia.Minutes.ToString().PadLeft(2,'0')+"m");
                    mensagem.AppendLine("");
                    mensagem.AppendLine("------------------------------------------------");
                    mensagem.AppendLine("* * * * * * * * * * P A G O * * * * * * * * * *");
                    mensagem.Append(Ticket.getFooter(false, cabineVO, usuarioVO));

                    while (true)
                    {
                        if (!Ticket.checkPrint() || !Ticket.printTicket(mensagem.ToString()))
                        {
                            DialogResult dr = MessageBox.Show(this, "Tentar novamente?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                            if (dr.ToString().Equals("Yes"))
                            {
                                continue;
                            }
                            dr = MessageBox.Show(this, "Deseja efetivar a entrada sem a emissão do ticket?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                            if (dr.ToString().Equals("Yes"))
                            {
                                FormMessage formx = new FormMessage();
                                formx.setText(Ticket.cutText(mensagem.ToString()));
                                formx.ShowDialog(this);
                                break;
                            }
                            else
                            {
                                return;
                            }
                        }
                        else
                        {
                            break;
                        }

                    }

                    //Gravar saida
                    ModelBO.setMovimentacao(movimentacaoVO);

                }
                else
                {
                    //Saida
                    CorVO corVO = null;
                    TipoVeiculoVO tipoVeiculoVO = null;
                    MarcaVO marcaVO = null;
                    ModeloVO modeloVO = null;
                    if (this.labelCor.Tag !=null) corVO = (CorVO)this.labelCor.Tag;
                    if (this.labelTipo.Tag !=null) tipoVeiculoVO = (TipoVeiculoVO)this.labelTipo.Tag;
                    if (this.labelMarca.Tag !=null) marcaVO = (MarcaVO)this.labelMarca.Tag;
                    if (this.labelModelo.Tag != null) modeloVO = (ModeloVO)this.labelModelo.Tag;

                    FormCadastroSaida formx = new FormCadastroSaida();
                    formx.setMovimentacaoVO(movimentacaoVO, corVO, tipoVeiculoVO, marcaVO, modeloVO, usuarioVO);
                    formx.ShowDialog(this);
                }
            }
            else
            {
                int ticket = ModelBO.getTicket();
                if (ticket == -1)
                {
                    MessageBox.Show("Não foi possível gerar número de ticket!\nVerifique se Parametro Liberado está com o valor \"S\"", "Aviso");
                    return;
                }
                
                //Entrada
                movimentacaoVO = MovimentacaoVO.CreateMovimentacaoVO();
                movimentacaoVO.placa = placa;
                movimentacaoVO.ticket = ticket;
                movimentacaoVO.entrada = DateTime.Now;
                movimentacaoVO.obs = this.textBoxObs.Text;
                movimentacaoVO.especie = (string)this.labelTipoCobranca.Tag;
                movimentacaoVO.idConvenio = -1;
                movimentacaoVO.fechDiario = false;
                movimentacaoVO.fechConvenio = false;
                movimentacaoVO.fechCabine = false;
                movimentacaoVO.idCabineE = cabineVO.idCabine;
                movimentacaoVO.idCabineS = -1;

                bool imprimeTicket = true;

                if (this.labelMensalista.Tag != null)
                {
                    movimentacaoVO.idMensalista = ((MensalistaVO)this.labelMensalista.Tag).idMensalista;
                    DialogResult dr = MessageBox.Show(this, "Deseja imprimir o Ticket de entrada para o Mensalista?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (dr.ToString().Equals("Yes"))
                        imprimeTicket = true;
                    else
                        imprimeTicket = false;
                }
                else
                    movimentacaoVO.idMensalista = -1;

                StringBuilder mensagem = new StringBuilder();
                mensagem.Append(Ticket.getHeader());
                mensagem.AppendLine(movimentacaoVO.entrada.ToString("dddd dd/MM/yyyy HH:mm:ss - Seq.: " + ticket.ToString().PadLeft(4, '0')));
                mensagem.AppendLine("------------------------------------------------");
                mensagem.AppendLine("");
                mensagem.AppendLine("<e><ce>ENTRADA " + movimentacaoVO.especie.ToUpper() + "</ce></e>");
                mensagem.AppendLine("");
                mensagem.AppendLine((this.labelMarca.Tag != null ? this.labelMarca.Text + " " : "") + (this.labelModelo.Tag != null ? this.labelModelo.Text + " " : "") + (this.labelCor.Tag != null ? this.labelCor.Text : ""));
                mensagem.AppendLine("");
                mensagem.AppendLine("<e>Placa : " + movimentacaoVO.placa + "</e>");
                mensagem.AppendLine("");
                mensagem.AppendLine("------------------------------------------------");
                if (this.shapeContainer1.Shapes.Count > 0)
                {
                    mensagem.AppendLine("Avarias:");
                    foreach (Shape shape in this.shapeContainer1.Shapes)
                    {
                        if (shape.Tag != null)
                        {
                            TipoColisaoVO tipoColisaoVO = (TipoColisaoVO)shape.Tag;
                            mensagem.AppendLine("\t" + tipoColisaoVO.colisao);
                        }
                    }
                    mensagem.AppendLine("------------------------------------------------");
                }

                if (this.textBoxObs.Text.Trim().Length > 0)
                {
                    mensagem.AppendLine("Observacao:");
                    mensagem.AppendLine(this.textBoxObs.Text);
                    mensagem.AppendLine("------------------------------------------------");
                }
                if (this.labelTipoCobranca.Text.Equals(MovimentacaoVO.Especie.DiariaEspecial))
                {
                    mensagem.AppendLine("* * * * * * * * * * P A G O * * * * * * * * * * ");
                    mensagem.AppendLine("------------------------------------------------");
                }
                mensagem.Append(Ticket.getFooter(false, cabineVO, usuarioVO));

                //if (this.labelMensalista.Tag != null) mensagem.AppendLine("Mensalista: " + ((MensalistaVO)this.labelMensalista.Tag).clienteVO.nome);
                //mensagem.AppendLine("Modalidade: " + this.labelTipoCobranca.Text);
                //mensagem.AppendLine("------------------------------------------------");
                //mensagem.AppendLine("Veiculo:");
                //mensagem.AppendLine("\tTipo: "+this.labelTipo.Text);

                while (imprimeTicket)
                {
                    if (!Ticket.checkPrint() || !Ticket.printTicket(mensagem.ToString())){
                        DialogResult dr = MessageBox.Show(this, "Tentar novamente?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (dr.ToString().Equals("Yes"))
                        {
                            continue;
                        }
                        dr = MessageBox.Show(this, "Deseja efetivar a entrada sem a emissão do ticket?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (dr.ToString().Equals("Yes"))
                        {
                            FormMessage formx = new FormMessage();
                            formx.setText(Ticket.cutText(mensagem.ToString()));
                            formx.ShowDialog(this);
                            break;
                        }
                        else
                        {
                            return;
                        }
                    }
                    else
                    {
                        break;
                    }

                }
                
                //Gerar movimentação de entrada
                ModelBO.newMovimentacao(movimentacaoVO);
            }

            this.buttonReset_Click(sender, e);
        }

        private void buttonFechar_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        private void buttonOutrasFuncoes_Click(object sender, EventArgs e)
        {
            MensalistaVO mensalistaVO = null;
            if (this.labelMensalista.Tag != null)
                mensalistaVO = (MensalistaVO)this.labelMensalista.Tag;

            string placa = this.textBoxPlaca.Text;
            placa = placa.Replace('_', ' ').Trim();

            FormOutrasFuncoes formx = new FormOutrasFuncoes();
            formx.setData(this.cabineVO, mensalistaVO, placa, usuarioVO);
            formx.ShowDialog(this);
        }

       
     }
}
